#ifndef TASKQUEUE_H
#define TASKQUEUE_H

#include <iostream>
#include <queue>
#include <mutex>
#include <functional>
#include <future>
#include <thread>
#include <utility>
#include <vector>

using namespace std;

/**
 * @brief The TaskQueue class           任务队列类模板，实现线程安全
 */
template<typename T>
class TaskQueue
{
public:
    TaskQueue(){}
    ~TaskQueue(){}

    /**
     * @brief empty         队列是否为空
     * @return
     */
    bool empty()
    {
        std::lock_guard<std::mutex> lockguard(m_mutex);
        return m_queue.empty();
    }

    /**
     * @brief size          队列大小
     * @return
     */
    int size()
    {
        std::lock_guard<std::mutex> lockguard(m_mutex);
        return m_queue.size();
    }

    /**
     * @brief pushQueue     数据入栈
     * @param t
     * @return
     */
    void pushQueue(T &t)
    {
        std::lock_guard<std::mutex> lockguard(m_mutex);
        m_queue.emplace(t);
    }

    /**
     * @brief popQueue      数据出栈
     * @param t
     * @return
     */
    bool popQueue(T &t)
    {
        std::lock_guard<std::mutex> lockguard(m_mutex);
        if ( m_queue.empty() )
            return false;

        t = std::move(m_queue.front());     // 取出队首元素，返回队首元素值，并进行右值引用

        m_queue.pop();          // 删除队列首元素
        return true;
    }

private:
    mutex m_mutex;              // 互斥锁
    queue<T> m_queue;           // 存放任务的队列
};

#endif
